struct exec_domain *ed, full_execution_context_t *c)
{
int i;
- unsigned long vmx_domain = ed->arch.arch_vmx.flags;
+#ifdef __i386__ /* Remove when x86_64 VMX is implemented */
+ unsigned long vmx_domain;
extern void save_vmx_execution_context(execution_context_t *);
+#endif
c->flags = 0;
memcpy(&c->cpu_ctxt,
&ed->arch.user_ctxt,
sizeof(ed->arch.user_ctxt));
+#ifdef __i386__
+ vmx_domain = ed->arch.arch_vmx.flags;
if (vmx_domain)
save_vmx_execution_context(&c->cpu_ctxt);
+#endif
if ( test_bit(EDF_DONEFPUINIT, &ed->ed_flags) )
c->flags |= ECF_I387_VALID;
c->kernel_ss = ed->arch.kernel_ss;
c->kernel_esp = ed->arch.kernel_sp;
c->pt_base =
- pagetable_val(ed->arch.pagetable);
+ pagetable_val(ed->arch.guest_table);
memcpy(c->debugreg,
ed->arch.debugreg,
sizeof(ed->arch.debugreg));
d->arch.failsafe_address = c->failsafe_callback_eip;
phys_basetab = c->pt_base;
- d->arch.pagetable = mk_pagetable(phys_basetab);
- d->arch.phys_table = d->arch.pagetable;
+ d->arch.guest_table = mk_pagetable(phys_basetab);
+ d->arch.phys_table = d->arch.guest_table;
if ( !get_page_and_type(&frame_table[phys_basetab>>PAGE_SHIFT], d->domain,
PGT_base_page_table) )
return -EINVAL;
struct exec_domain *ed = current;
if ( unlikely(copy_from_user(&stu, (void *)regs->rsp, sizeof(stu))) ||
- unlikely(pagetable_val(ed->arch.pagetable_user) == 0) )
+ unlikely(pagetable_val(ed->arch.guest_table_user) == 0) )
return -EFAULT;
ed->arch.flags &= ~TF_kernel_mode;
/* Drop the in-use references to page-table bases. */
for_each_exec_domain ( d, ed )
{
- if ( pagetable_val(ed->arch.pagetable) != 0 )
+ if ( pagetable_val(ed->arch.guest_table) != 0 )
{
put_page_and_type(
- &frame_table[pagetable_val(ed->arch.pagetable) >> PAGE_SHIFT]);
- ed->arch.pagetable = mk_pagetable(0);
+ &frame_table[pagetable_val(ed->arch.guest_table) >> PAGE_SHIFT]);
+ ed->arch.guest_table = mk_pagetable(0);
}
- if ( pagetable_val(ed->arch.pagetable_user) != 0 )
+ if ( pagetable_val(ed->arch.guest_table_user) != 0 )
{
put_page_and_type(
- &frame_table[pagetable_val(ed->arch.pagetable_user) >>
+ &frame_table[pagetable_val(ed->arch.guest_table_user) >>
PAGE_SHIFT]);
- ed->arch.pagetable_user = mk_pagetable(0);
+ ed->arch.guest_table_user = mk_pagetable(0);
}
}
pagetable_val(ed->arch.monitor_table) :
pagetable_val(ed->arch.shadow_table));
else
- pa = pagetable_val(ed->arch.pagetable);
+ pa = pagetable_val(ed->arch.guest_table);
#else
if ( unlikely(shadow_mode(d)) )
pa = pagetable_val(ed->arch.shadow_table);
#ifdef __x86_64__
else if ( !(ed->arch.flags & TF_kernel_mode) )
- pa = pagetable_val(ed->arch.pagetable_user);
+ pa = pagetable_val(ed->arch.guest_table_user);
#endif
else
- pa = pagetable_val(ed->arch.pagetable);
+ pa = pagetable_val(ed->arch.guest_table);
#endif
write_cr3(pa);
invalidate_shadow_ldt(ed);
percpu_info[cpu].deferred_ops &= ~DOP_FLUSH_TLB;
- old_base_pfn = pagetable_val(ed->arch.pagetable) >> PAGE_SHIFT;
- ed->arch.pagetable = mk_pagetable(pfn << PAGE_SHIFT);
+ old_base_pfn = pagetable_val(ed->arch.guest_table) >> PAGE_SHIFT;
+ ed->arch.guest_table = mk_pagetable(pfn << PAGE_SHIFT);
shadow_mk_pagetable(ed);
else
{
unsigned long old_pfn =
- pagetable_val(ed->arch.pagetable_user) >> PAGE_SHIFT;
- ed->arch.pagetable_user = mk_pagetable(pfn << PAGE_SHIFT);
+ pagetable_val(ed->arch.guest_table_user) >> PAGE_SHIFT;
+ ed->arch.guest_table_user = mk_pagetable(pfn << PAGE_SHIFT);
if ( old_pfn != 0 )
put_page_and_type(&frame_table[old_pfn]);
}
cleanup_writable_pagetable(d);
if ( unlikely(shadow_mode(d)) )
- check_pagetable(d, ed->arch.pagetable, "pre-mmu"); /* debug */
+ check_pagetable(d, ed->arch.guest_table, "pre-mmu"); /* debug */
/*
* If we are resuming after preemption, read how much work we have already
__put_user(done + i, pdone);
if ( unlikely(shadow_mode(d)) )
- check_pagetable(d, ed->arch.pagetable, "post-mmu"); /* debug */
+ check_pagetable(d, ed->arch.guest_table, "post-mmu"); /* debug */
UNLOCK_BIGLOCK(d);
return rc;
if ( shadow_mode(d) == SHM_logdirty )
mark_dirty(d, va_to_l1mfn(va));
- check_pagetable(d, ed->arch.pagetable, "va"); /* debug */
+ check_pagetable(d, ed->arch.guest_table, "va"); /* debug */
}
deferred_ops = percpu_info[cpu].deferred_ops;
synchronise_pagetables(~0UL);
printk("pt base=%lx sh_info=%x\n",
- pagetable_val(d->exec_domain[0]->arch.pagetable)>>PAGE_SHIFT,
+ pagetable_val(d->exec_domain[0]->arch.guest_table)>>PAGE_SHIFT,
virt_to_page(d->shared_info)-frame_table);
spin_lock(&d->page_alloc_lock);
/* PHASE 1 */
- if ( pagetable_val(d->exec_domain[0]->arch.pagetable) )
- adjust(&frame_table[pagetable_val(d->exec_domain[0]->arch.pagetable)
+ if ( pagetable_val(d->exec_domain[0]->arch.guest_table) )
+ adjust(&frame_table[pagetable_val(d->exec_domain[0]->arch.guest_table)
>>PAGE_SHIFT], -1, 1);
list_ent = d->page_list.next;
spin_unlock(&d->page_alloc_lock);
- if ( pagetable_val(d->exec_domain[0]->arch.pagetable) )
+ if ( pagetable_val(d->exec_domain[0]->arch.guest_table) )
adjust(&frame_table[pagetable_val(
- d->exec_domain[0]->arch.pagetable)>>PAGE_SHIFT], 1, 1);
+ d->exec_domain[0]->arch.guest_table)>>PAGE_SHIFT], 1, 1);
printk("Audit %d: Done. pages=%d l1=%d l2=%d ctot=%d ttot=%d\n", d->id, i, l1, l2, ctot, ttot );
set_bit(DF_IDLETASK, &idle->d_flags);
- ed->arch.pagetable = mk_pagetable(__pa(idle_pg_table));
+ ed->arch.guest_table = mk_pagetable(__pa(idle_pg_table));
map_cpu_to_boot_apicid(cpu, apicid);
break;
case 3: /* Read CR3 */
- *reg = pagetable_val(ed->arch.pagetable);
+ *reg = pagetable_val(ed->arch.guest_table);
break;
default:
d->arch.arch_vmx.cpu_cr3);
domain_crash(); /* need to take a clean path */
}
- old_base_pfn = pagetable_val(d->arch.pagetable) >> PAGE_SHIFT;
+ old_base_pfn = pagetable_val(d->arch.guest_table) >> PAGE_SHIFT;
/*
- * Now mm.pagetable points to machine physical.
+ * Now arch.guest_table points to machine physical.
*/
- d->arch.pagetable = mk_pagetable(pfn << PAGE_SHIFT);
+ d->arch.guest_table = mk_pagetable(pfn << PAGE_SHIFT);
- VMX_DBG_LOG(DBG_LEVEL_VMMU, "New mm.pagetable = %lx\n",
+ VMX_DBG_LOG(DBG_LEVEL_VMMU, "New arch.guest_table = %lx\n",
(unsigned long) (pfn << PAGE_SHIFT));
shadow_lock(d->domain);
* We simply invalidate the shadow.
*/
pfn = phys_to_machine_mapping(value >> PAGE_SHIFT);
- if ((pfn << PAGE_SHIFT) != pagetable_val(d->arch.pagetable))
+ if ((pfn << PAGE_SHIFT) != pagetable_val(d->arch.guest_table))
__vmx_bug(regs);
vmx_shadow_clear_state(d->domain);
shadow_invalidate(d);
}
pfn = phys_to_machine_mapping(value >> PAGE_SHIFT);
vmx_shadow_clear_state(d->domain);
- d->arch.pagetable = mk_pagetable(pfn << PAGE_SHIFT);
+ d->arch.guest_table = mk_pagetable(pfn << PAGE_SHIFT);
shadow_mk_pagetable(d);
/*
* mm->shadow_table should hold the next CR3 for shadow
error |= __vmwrite(GUEST_TR_BASE, 0);
error |= __vmwrite(GUEST_TR_LIMIT, 0xff);
- ed->arch.shadow_table = ed->arch.pagetable;
- __vmwrite(GUEST_CR3, pagetable_val(ed->arch.pagetable));
+ ed->arch.shadow_table = ed->arch.guest_table;
+ __vmwrite(GUEST_CR3, pagetable_val(ed->arch.guest_table));
__vmwrite(HOST_CR3, pagetable_val(ed->arch.monitor_table));
__vmwrite(HOST_ESP, (unsigned long)get_stack_bottom());
mk_l2_pgentry((unsigned long)l2start | __PAGE_HYPERVISOR);
l2tab[PERDOMAIN_VIRT_START >> L2_PAGETABLE_SHIFT] =
mk_l2_pgentry(__pa(d->arch.mm_perdomain_pt) | __PAGE_HYPERVISOR);
- ed->arch.pagetable = mk_pagetable((unsigned long)l2start);
+ ed->arch.guest_table = mk_pagetable((unsigned long)l2start);
l2tab += l2_table_offset(dsi.v_start);
mfn = alloc_start >> PAGE_SHIFT;
mk_l4_pgentry(__pa(l4start) | __PAGE_HYPERVISOR);
l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] =
mk_l4_pgentry(__pa(d->arch.mm_perdomain_l3) | __PAGE_HYPERVISOR);
- ed->arch.pagetable = mk_pagetable(__pa(l4start));
+ ed->arch.guest_table = mk_pagetable(__pa(l4start));
l4tab += l4_table_offset(dsi.v_start);
mfn = alloc_start >> PAGE_SHIFT;
* are put in this table (eg. the current GDT is mapped here).
*/
l1_pgentry_t *perdomain_ptes;
- pagetable_t pagetable;
- pagetable_t pagetable_user; /* x86/64: user-space pagetable. */
- pagetable_t monitor_table;
- pagetable_t phys_table; /* 1:1 pagetable */
- pagetable_t shadow_table;
+ pagetable_t guest_table_user; /* x86/64: user-space pagetable. */
+ pagetable_t guest_table; /* guest notion of cr3 */
+ pagetable_t shadow_table; /* shadow of guest */
+ pagetable_t monitor_table; /* used in hypervisor */
+
+ pagetable_t phys_table; /* guest 1:1 pagetable */
+
l2_pgentry_t *vpagetable; /* virtual address of pagetable */
l2_pgentry_t *shadow_vtable; /* virtual address of shadow_table */
l2_pgentry_t *guest_pl2e_cache; /* guest page directory cache */
#define IDLE0_ARCH_EXEC_DOMAIN \
{ \
perdomain_ptes: 0, \
- pagetable: mk_pagetable(__pa(idle_pg_table)) \
+ guest_table: mk_pagetable(__pa(idle_pg_table)) \
}
#endif /* __ASM_DOMAIN_H__ */
static inline void __shadow_mk_pagetable(struct exec_domain *ed)
{
struct domain *d = ed->domain;
- unsigned long gpfn = pagetable_val(ed->arch.pagetable) >> PAGE_SHIFT;
+ unsigned long gpfn = pagetable_val(ed->arch.guest_table) >> PAGE_SHIFT;
unsigned long smfn = __shadow_status(d, gpfn) & PSH_pfn_mask;
SH_VVLOG("0: __shadow_mk_pagetable(gpfn=%p, smfn=%p)", gpfn, smfn);
if ( unlikely(shadow_mode(ed->domain)) )
{
SH_VVLOG("shadow_mk_pagetable( gptbase=%p, mode=%d )",
- pagetable_val(ed->arch.pagetable),
+ pagetable_val(ed->arch.guest_table),
shadow_mode(ed->domain));
shadow_lock(ed->domain);
SH_VVLOG("leaving shadow_mk_pagetable:\n"
"( gptbase=%p, mode=%d ) sh=%p",
- pagetable_val(ed->arch.pagetable),
+ pagetable_val(ed->arch.guest_table),
shadow_mode(ed->domain),
pagetable_val(ed->arch.shadow_table) );
}